From: Keir Fraser Date: Thu, 17 Jun 2010 07:52:50 +0000 (+0100) Subject: cpuidle: redirect some hpet lock users to a new cpumask_lock X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11912 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=df52a1391236928859f95290a21713fc533386bf;p=xen.git cpuidle: redirect some hpet lock users to a new cpumask_lock The hpet channel lock was also used for prevent handle_hpet_broadcast access other cpu's timer_deadline_start/end after other cpu was already waken up. This purpose can be approached via a standalone lock to remove much spins on the hpet channel lock. Signed-off-by: Wei Gang --- diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 4bfc11d9c4..d1fe7a5ee0 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -34,6 +34,7 @@ struct hpet_event_channel int shift; s_time_t next_event; cpumask_t cpumask; + spinlock_t cpumask_lock; spinlock_t lock; void (*event_handler)(struct hpet_event_channel *); @@ -196,7 +197,7 @@ again: /* find all expired events */ for_each_cpu_mask(cpu, ch->cpumask) { - spin_lock_irq(&ch->lock); + spin_lock_irq(&ch->cpumask_lock); if ( cpumask_test_cpu(cpu, ch->cpumask) ) { @@ -206,7 +207,7 @@ again: next_event = per_cpu(timer_deadline_end, cpu); } - spin_unlock_irq(&ch->lock); + spin_unlock_irq(&ch->cpumask_lock); } /* wakeup the cpus which have an expired event. */ @@ -579,6 +580,7 @@ void hpet_broadcast_init(void) hpet_events[i].next_event = STIME_MAX; hpet_events[i].event_handler = handle_hpet_broadcast; spin_lock_init(&hpet_events[i].lock); + spin_lock_init(&hpet_events[i].cpumask_lock); } return; @@ -613,6 +615,7 @@ void hpet_broadcast_init(void) legacy_hpet_event.idx = 0; legacy_hpet_event.flags = 0; spin_lock_init(&legacy_hpet_event.lock); + spin_lock_init(&legacy_hpet_event.cpumask_lock); if ( !force_hpet_broadcast ) pv_rtc_handler = handle_rtc_once; @@ -689,9 +692,9 @@ void hpet_broadcast_exit(void) if ( !reprogram_timer(this_cpu(timer_deadline_start)) ) raise_softirq(TIMER_SOFTIRQ); - spin_lock_irq(&ch->lock); + spin_lock_irq(&ch->cpumask_lock); cpu_clear(cpu, ch->cpumask); - spin_unlock_irq(&ch->lock); + spin_unlock_irq(&ch->cpumask_lock); if ( ch != &legacy_hpet_event ) {